WITH Ada.Text_IO; Use Ada.Text_IO;
WITH Ada.Command_Line;
WITH Etudiant.fonctionalites;
WITH Fichier;

PROCEDURE Paresseux IS

   -- Sous menu pour la gestion des matieres
   PROCEDURE MenuMatiere(monEtu : IN OUT Etudiant.Etudiant) IS
      choice : natural range 1 .. 2;
   BEGIN
      IF Etudiant.fonctionalites.GetNombreMatieres(monEtu) = 0 THEN
         Ada.Text_IO.Put_Line("Il n'y a pas de matiere enregistree dans votre bulletin.");
      ELSE

         put_line("Que voulez vous faire ?");
         put_line("1 - Modifier le coefficient d'une matiere");
         put_line("2 - Modifier la note d'une matiere");
         put("Votre choix : ");
         Choice := Natural'Value(Get_line);
         CASE Choice IS
         WHEN 1 => Etudiant.fonctionalites.PondererMatiere(monEtu);
         WHEN 2 => Etudiant.fonctionalites.ModIFierNoteMatiere(monEtu);
         END CASE;
      END IF;
   END MenuMatiere;



   -- Menu propose une fois l'etudiant cree
   PROCEDURE EtudiantCreated (monEtu  : IN OUT Etudiant.Etudiant) IS
      choice : natural range 0 .. 7;
   BEGIN
      LOOP
         BEGIN

            Ada.Text_IO.New_Line;
            put_line("Menu : Que voulez vous faire ? ("&Natural'Image(Etudiant.fonctionalites.GetNombreMatieres(monEtu))&" matiere(s) )");
            put_line("1 - Creer un nouveau bulletin pour cet etudiant");
            put_line("2 - Afficher la situation de l'etudiant");
            put_line("3 - Classer le bulletin");
            put_line("4 - Ajouter une matiere au bulletin");
            put_line("5 - Retirer une matiere du bulletin");
            put_line("6 - Modifier une matiere du bulletin");
            put_line("7 - Fixer un nouvel objectif");

            put_line("0 - Revenir au niveau inferieur");
            put("Votre choix : ");

            Choice := Natural'Value(Get_line);
            New_Line;

            -- Actions effectuees en fonction du choix de l'utilISateur
            CASE Choice IS
               WHEN 0 =>
                  -- Si un nom de fichier est renseigne on sauvegarde dedans
                  IF Ada.Command_Line.Argument_Count = 1 then
                     Fichier.EcrireAvecNomFichier(monEtu, Ada.Command_Line.Argument(1));

                     -- Sinon on sauve dans le fichier prenom.nom.svg
                  else
                     Fichier.Ecrire(X => monEtu);
                  END IF;
                  Ada.Text_IO.Put_Line("Donnees sauvegardees");
                  exit;
               WHEN 1 => Etudiant.Fonctionalites.CreerBulletin(monEtu);
               WHEN 2 => Etudiant.Fonctionalites.AfficheSituation(monEtu);
               WHEN 3 => Etudiant.Fonctionalites.ClasserBulletin(monEtu);
               WHEN 4 =>  Etudiant.Fonctionalites.AjoutMatiereBulletin(monEtu);
               WHEN 5 => Etudiant.Fonctionalites.RetirerMatiereBulletin(monEtu);
               WHEN 6 => MenuMatiere(monEtu);
               WHEN 7 =>  Etudiant.Fonctionalites.FixerObjectIFBulletin(monEtu);
               WHEN others => null;

            END CASE;

         EXCEPTION
            WHEN Constraint_Error => put_line("Operation impossible");


         END;
      END LOOP;
   END etudiantcreated;


   -- Contenu du Main --
   unEtu : Etudiant.Etudiant;
   choice : natural range 0 .. 2;

BEGIN
   IF Ada.Command_Line.Argument_Count = 1 then
      Fichier.LireAvecNom(unEtu, Ada.Command_Line.Argument(1));
      EtudiantCreated(monEtu => unEtu);
   else

      put_line("Bienvenue dans l'application de gestion des etudiants.");
      put_line("------------------------------------------------------");
      New_Line;
      LOOP
         BEGIN
            put_line("Menu : Que voulez vous faire ?");
            put_line("1 - Creer un nouvel etudiant");
            put_line("2 - Charger un etudiant");
            put_line("0 - Quitter l'application");
            put("Votre choix : ");
            Choice := Natural'Value(Get_line);

            New_Line;
            CASE Choice IS
            WHEN 0 =>
               Put_Line("A bientot");
               Put_Line("------------------------------------------------------");
               exit;
            WHEN 1 => unEtu := Etudiant.CreerEtudiant;  etudiantcreated(unEtu);
            WHEN 2 => Fichier.Lire(X => unEtu); EtudiantCreated(monEtu => unEtu);
            WHEN others => put_line("Operation impossible");
            END CASE;



         EXCEPTION
            WHEN Constraint_Error => put_line("Operation impossible");
         END;
      END LOOP;
   END IF;
END Paresseux;
